package cl.minvu.catastro;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLDecoder;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;
import org.switchyard.component.bean.Service;

import cl.minvu.catastro.manager.EncuestadorManager;
import cl.minvu.catastro.manager.FichaManager;
import cl.minvu.catastro.model.DanoVivienda;
import cl.minvu.catastro.model.Encuestador;
import cl.minvu.catastro.model.Ficha;
import cl.minvu.catastro.model.GrupoSecundario;
import cl.minvu.catastro.model.InstalacionDomiciliaria;
import cl.minvu.catastro.util.CastUtil;
import cl.minvu.catastro.util.Constantes;
import cl.minvu.catastro.util.SecurityUtil;

/**
 * @author psep
 * 
 */
@Service(CreaFicha.class)
public class CreaFichaBean implements CreaFicha {

	private static final Logger logger = Logger.getLogger(CreaFichaBean.class);

	@Override
	public String creaFicha(String object) {
		logger.info("Iniciando proceso Ficha");
		
		String ficha = null;
		String foto = null;

		try {
			Map<String, String> map = CastUtil.getQueryMap(object);

			if (map == null) {
				logger.info("map es nulo");
				return SecurityUtil.encode(Constantes.ERROR_INPUT);
			} else {
				Set<String> keys = map.keySet();

				for (String key : keys) {

					if (key.equals("object")) {
						ficha = URLDecoder.decode(map.get(key), "UTF-8");
					} else if (key.equals("foto")) {
						foto = URLDecoder.decode(map.get(key), "UTF-8");
					}
				}
			}
			
			logger.info("la ficha es " + ficha);
			logger.info(foto);

			if (ficha == null) {
				logger.info("ficha es nula");
				return SecurityUtil.encode(Constantes.ERROR_VALIDA_DATOS);
			} else {
				ficha = SecurityUtil.decode(ficha);
				
				logger.info(ficha);
				
				Ficha fichaTO = CastUtil.getFicha(ficha, foto);
				BigInteger idEncuestador = this.validaEncuestador(fichaTO
						.getEncuestador());

				if (idEncuestador == null) {
					logger.info("error en el token");
					return SecurityUtil.encode(Constantes.ERROR_TOKEN);
				} else {
					fichaTO.getEncuestador().setIdencuestador(idEncuestador);
					List<InstalacionDomiciliaria> instalaciones = CastUtil.getListInstalacion(ficha);
					List<DanoVivienda> danoViviendas = CastUtil.getDanioList(ficha);
					List<GrupoSecundario> grupoSecundarios = CastUtil.getListGrupoSec(ficha);
					
					boolean insert = FichaManager.getInstance().createFicha(fichaTO, instalaciones, danoViviendas, grupoSecundarios);
					
					if (!insert) {
						logger.info("error interno");
						return SecurityUtil.encode(Constantes.ERROR_INTERNO);
					} else {
						return SecurityUtil.encode(Constantes.FICHA_RECEPCIONADA);
					}
					
				}
			}

		} catch (UnsupportedEncodingException e) {
			logger.error(e, e);
		}

		return SecurityUtil.encode(Constantes.ERROR_VALIDA_DATOS);
	}

	/**
	 * @param encuestador
	 * @return
	 */
	private BigInteger validaEncuestador(Encuestador encuestador) {
		encuestador = EncuestadorManager.getInstance().getEncuestador(
				encuestador);

		if (encuestador != null
				&& !encuestador.getFechaterminovigencia().before(new Date())) {
			return encuestador.getIdencuestador();
		} else {
			return null;
		}
	}

}
